package auth

import (
	"context"
	"fmt"
	"gitee.com/yimtune/webook/internal/service/sms"
	"github.com/golang-jwt/jwt/v5"
)

// 装饰器模式  添加验证token 功能
type AuthSMSService struct {
	svc sms.Service
	key []byte // token 密钥  用来解密 传来的token
}

func (s *AuthSMSService) Send(ctx context.Context, tplToken string, args []string, numbers ...string) error {
	var claims SMSClaims
	// 解析token
	_, err := jwt.ParseWithClaims(tplToken, &claims, func(token *jwt.Token) (interface{}, error) {

		return s.key, nil
	})
	if err != nil {
		//if errors.Is(err, jwt.ErrTokenSignatureInvalid) {
		//	return jwt.ErrTokenSignatureInvalid
		//} else {
		//	// %w 包装一个错误
		//	return fmt.Errorf("Custom error message: %w", err)
		//}

		//return fmt.Errorf("xx %w", err)
		fmt.Println("err", err)
		return err
	}
	// 解析成功 就获取token 里的 tpl 调用真正的发送逻辑
	return s.svc.Send(ctx, claims.Tpl, args, numbers...)
}

type SMSClaims struct {
	jwt.RegisteredClaims
	Tpl string
	// 额外加字段
}

func NewAuthSMSService(svc sms.Service) *AuthSMSService {
	return &AuthSMSService{
		svc: svc,
		key: []byte("k6CswdUm77WKcbM68UQUuxVsHSpTCwgK"),
	}

}

func NewSMSClaims() (string, error) {
	uc := SMSClaims{
		Tpl: "smsSendTpl",
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS512, uc)
	tokenStr, err := token.SignedString([]byte("k6CswdUm77WKcbM68UQUuxVsHSpTCwgK"))

	if err != nil {
		fmt.Println("err", err)
		return "", err
	}
	return tokenStr, nil
}
